
// 1、vscode配置自动编译

// 第一步   tsc --inti 生成tsconfig.json   改 "outDir": "./js",  
// 第二步 任务 - 运行任务  监视tsconfig.json

// void和never区别
// void可又被赋值为null和undefined，但never不能包含任何类型
// 返回类型为void的函数能还执行,但是返回never的函数无法正常执行


// 1.布尔类型（boolean）
// let married: boolean=false;

// 2.数字类型（number）
// let nums:number = 123

// 3.字符串类型(string)
// let firstname: string='zfpx';

// 4.数组类型（array）  ts中定义数组有两种方式
// let arr1:Array<number> = [1,2,3]
// let arr2:number[] = [12,34]

// 5.元组类型（tuple）就是固定了类型和长度的数组
// let arr3:[number,string] = [12,'23']

// 6.枚举类型(enum) 事先考虑某一个变量的所有的可能的值，尽量用自然语言中的单词表示它的每一个值
// 普通枚举
// enum Genner {
//     BOY,
//     GIRL
// }
// console.log(Genner.BOY,Genner[1]);  //0 GIRL
// 编译后：
// var Genner;
// (function (Genner) {
//     Genner[Genner["BOY"] = 0] = "BOY";
//     Genner[Genner["GIRL"] = 1] = "GIRL";
// })(Genner || (Genner = {}));
// console.log(Genner.BOY, Genner[1]); //0 GIRL
// 常数枚举：与普通枚举的区别是，它会在编译阶段被删除，并且不能包含计算成员。
// const enum Colors {
//     Red,Bule
// }
// let myColors = [Colors.Red, Colors.Bule, ];
// 编译后：
// var myColors = [0 /* Red */, 1 /* Bule */,];

// 7.任意类型（any）可以赋值给任意类型
// 如果变量定义为any类型,就跟JS差不多,不进行类型检查
// let root:any=document.getElementById('root');
// root.style.color='red';

// 8.null 和 undefined 其它类型的子类型
let x:number 
// x = 1
// x = undefined
// x = null
// 如果说strictNullChecks的值为true,则不能把null undefined赋值给x
// let x:number 
// x = 1
// x = undefined //报错


// 9.never类型 代表不会出现的值
// 作为不会返回（ return ）的函数的返回值类型
// function fn():never{
//     throw new Error() //直接异常结束 了
// }
// function fn2():never{
//     while(true){  //死循环不会有返回值
//     }
// }

// 10.void类型 :代表没有任何类型
// 函数可以返回 undefined和null
// 严格模式(strictNullChecks:true)下只能返回undefined
// function geet():void{
//     return undefined
// }

// 11.Symbol类型
// const sym1 = Symbol('key');
// const sym2 = Symbol('key');
// Symbol('key') === Symbol('key') // false

// 12.类型推论 是指编程语言中能够自动推导出值的类型的能力，它是一些强静态类型语言中出现的特性
// 定义时未赋值就会推论成any类型
// let username  //==> let username : any
// username = 2
// 如果定义的时候就赋值就能利用到类型推论
// let username = 12 //==> let username : number
// username = '233' //报错

// 13.包装对象
// 字面量创建的话会先进行new String('zf),那么就是就可以调用String.prototype下面的方法
// let name1 = 'zf'
// console.log(name1.toUpperCase()); //ZF

// 14.联合类型 表示取值可以为多种类型中的一种
// 14.1.基础类型联合
// 未赋值时联合类型上只能访问两个类型共有的属性和方法
// let name1: string | number;
// console.log(name1.toLocaleString()); //error
// name1 = 3;
// console.log(name1.toFixed(2));
// name1 = 'ikki';
// console.log(name1.length);
// 14.2 对象类型联合
// interface Women{
//     age: number,
//     cry(): void
// }
// interface Man{
//     age: number,
// }
// let p:(Women| Man) = {
//     age:1,
// }
// p.cry() //error

// 15.类型断言 以将一个联合类型的变量，指定为一个更加具体的类型
// let name2: string | number;
// console.log((name2! as string).length);
// console.log((name2! as number).toFixed(2));
// 不能将联合类型断言为不存在的类型
// console.log((name2 as boolean));  //报错
// 双重断言
// console.log((name2! as any as boolean));

// 16.字面量类型和类型字面量
// 字面量类型的要和实际的值的字面量一一对应,如果不一致就会报错
// const up:'Up'= 'Up';
// const down: 'Down' = 'Down';
// const left: 'Left' = 'Left';
// const right: 'Right' = 'Right';
// type Direction = 'Up' | 'Down' | 'Left' | 'Right';
// function fn(direction:Direction){}
// fn('Down')
// 类型字面量和对象字面量的语法很相似
// type Person =  {
//     name:string,
//     age:number
// }
// const p1 : Person = {
//     name:"ikki",
//     age:28
// }

// 17.字符串字面量和联合类型 
// 字符串字面量类型用来约束取值只能是某几个字符串中的一个, 联合类型（Union Types）表示取值可以为多种类型中的一种
// 字符串字面量 限定了使用该字面量的地方仅接受特定的值,联合类型 对于值并没有限定，仅仅限定值的类型需要保持一致
// type T1 = '1'|'2'|'3';
// type T2 = string|number|boolean;
// let t1:T1 = '1';
// let t2:T2 = true;

// 18.交叉类型
// 18.1 对象类型交叉
// 理解：多种类型的集合，联合对象将具有所联合类型的所有成员
// interface People {
//     age: number,
//     height:number
// }
// interface Man{
//     sex: string
// }
// const lilei = (man: People & Man) => {
//     console.log(man.age)
//     console.log(man.height)
//     console.log(man.sex)
// }
// lilei({age: 18,height: 180,sex: 'male'});

// 18.2普通类型交叉
// type A = number & string //type A = never






